/**
 * Servlet GestionPacientes: destinado a la gestion de todas las acciones que tendran
 * una vinculacion directa con los medicamentos
 */

package infb.servlet.movil;

// Importaciones externas
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.naming.*;
import java.util.*;

// Importaciones internas
import infb.modelo.*;
import infb.dao.*;
import java.text.SimpleDateFormat;


public class GestionPacientes extends HttpServlet {

    PacientesInterfaz pacienteDAO=null;

    /**
     * Metodo para inicializar la capa DAO utilizada en el servlet: muy importante a la hora
     * de optimizar los recursos de nuestra aplicacion
     * @param config
     * @throws javax.servlet.ServletException
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        // Inicializacion de objetos de la capa DAO
        try{
            Context contexto=new InitialContext();
            pacienteDAO=(PacientesInterfaz)contexto.lookup("PacientesEJB");

        }catch(Exception e){
            e.printStackTrace();
        }
    }

    /**
     * Metodo auxiliar para la gestion de la solicitud de citas del paciente
     * @param entradaDesdeCliente El flujo de informacion entrante desde el cliente
     *        utilizado para recibir los parametros oportunos que necesitara el metodo
     * @param salidaHaciaCliente El flujo de informacion saliente hacia el cliente
     *        enviado desde el servidor para retransmitir los resultados de las operaciones
     *        realizadas
     * @throws java.io.IOException
     */
    private void buscarPacientes(DataInputStream entradaDesdeCliente,DataOutputStream salidaHaciaCliente)
    throws IOException {
        // Leemos los parametros enviados por el cliente: concretamente y para este metodo
        // el nombre del medicamento y su categoria
        String nombre=entradaDesdeCliente.readUTF();
        String dni=entradaDesdeCliente.readUTF();
        // Reutilizamos el metodo de la capa DAO anteriormente implementado
        List listaPacientes=pacienteDAO.busquedaAvanzadaMobile(nombre,dni);
        // Primeramente enviamos al dispositivo movil cliente el numero de pacientes recuperado

        if(listaPacientes==null){
            salidaHaciaCliente.writeInt(0);
        }else{
            salidaHaciaCliente.writeInt(listaPacientes.size());

            // Aqui empieza el trabajo duro: recorrer todos los objetos del array y enviar
            // sus atributos al flujo de salida. Esto es realmente definir un protocolo,
            // puesto que en el lado del cliente, deberemos ser consecuentes con esta forma
            // de enviar (en resumen, recibir los mismos parametros en el mismo orden)
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
            String fecha=null;
            for(int i=0;i<listaPacientes.size();i++){
                Pacientes paciente=(Pacientes)listaPacientes.get(i);
                salidaHaciaCliente.writeUTF(paciente.getIdentificacion());
                salidaHaciaCliente.writeUTF(paciente.getNombre());


                salidaHaciaCliente.writeUTF(paciente.getApellido1());
                salidaHaciaCliente.writeUTF(paciente.getApellido2());
                salidaHaciaCliente.writeUTF(paciente.getTelefono());
                salidaHaciaCliente.writeUTF(paciente.getMail());
                salidaHaciaCliente.writeUTF(paciente.getDireccion());
                salidaHaciaCliente.writeUTF(paciente.getLocalidad());
                salidaHaciaCliente.writeUTF(paciente.getGrupoSanguineo());
                fecha="";
                if(paciente.getFechaNacimiento()!=null)fecha=sdf.format(paciente.getFechaNacimiento());               
                salidaHaciaCliente.writeUTF(fecha);

                
             /*   salidaHaciaCliente.writeUTF(paciente.getAltura().toString());
                salidaHaciaCliente.writeUTF(paciente.getPeso().toString());
                salidaHaciaCliente.writeUTF(paciente.getObservaciones());*/
                
            }
        }
        salidaHaciaCliente.flush();
    }

    private void verHistorial(DataInputStream entradaDesdeCliente,DataOutputStream salidaHaciaCliente)
    throws IOException {
        String dni=entradaDesdeCliente.readUTF();

        Context contexto=null;
        PacientesInterfaz iPaciente=null;
        PartesMedicosInterfaz iParteMedico=null;
        try {
            contexto = new InitialContext();
            iPaciente = (PacientesInterfaz) contexto.lookup("PacientesEJB");
            iParteMedico = (PartesMedicosInterfaz) contexto.lookup("PartesMedicosEJB");
        
        } catch (NamingException ex) {
            Logger.getLogger(GestionPacientes.class.getName()).log(Level.SEVERE, null, ex);
        }
        Pacientes  paciente=iPaciente.buscarPorDNI(dni);
        List<PartesMedicos> listaPartesMedicos = iParteMedico.ListarHistorialPaciente(paciente.getId());
        if(listaPartesMedicos==null){
            salidaHaciaCliente.writeInt(0);
        }else{
            salidaHaciaCliente.writeInt(listaPartesMedicos.size());

            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
            String fecha=null;
            PartesMedicos pm;
            for(int i=0;i<listaPartesMedicos.size();i++){
                pm=(PartesMedicos)listaPartesMedicos.get(i);


                salidaHaciaCliente.writeUTF(pm.getSintomas());
                salidaHaciaCliente.writeUTF(pm.getDiagnostico());               
                salidaHaciaCliente.writeUTF(pm.getTratamiento());
                if(pm.getFechaTramitacion()!=null)fecha=sdf.format(pm.getFechaTramitacion());
                salidaHaciaCliente.writeUTF(fecha);fecha="";
                if(pm.getFechaFinalizacion()!=null)fecha=sdf.format(pm.getFechaFinalizacion());
                salidaHaciaCliente.writeUTF(fecha);fecha="";
            }
        }
        salidaHaciaCliente.flush();
    }

    /**
     * Procesa la peticion del cliente (dispositivo movil) para atender peticiones de login/logout
     * @param peticion El objeto que encapsula la peticion del cliente
     * @param response El objeto que encapsula la respuesta del servidor a la peticion en cuestion
     * @throws ServletException Si ocurre un error especifico de servlet
     * @throws IOException Si ocurre un error de entrada/salida
     */
    protected void procesarPeticion(HttpServletRequest peticion,HttpServletResponse respuesta)
    throws ServletException,IOException {
        // Inicializacion de los flujos
        DataInputStream entradaDesdeCliente=new DataInputStream(peticion.getInputStream());
        DataOutputStream salidaHaciaCliente=new DataOutputStream(respuesta.getOutputStream());
        // Procesamos el mensaje enviado por el cliente: la accion (login o logout), el perfil: necesario
        // para saber sobre que tabla autenticarnos, la identificacion: que sera o bien la tarjeta sanitaria en caso
        // de un paciente o bien el numero de colegiado en caso del medico, y por ultimo el password

        String accion=entradaDesdeCliente.readUTF();
        if(accion.equalsIgnoreCase("buscar_pacientes")){
            buscarPacientes(entradaDesdeCliente,salidaHaciaCliente);
        }else if(accion.equalsIgnoreCase("ver_historial")){
            verHistorial(entradaDesdeCliente,salidaHaciaCliente);
        }
        // Cerramos los flujos
        entradaDesdeCliente.close();
        salidaHaciaCliente.close();
    }

    /**
     * Procesamiento de peticiones cliente GET
     * @param peticion El objeto que encapsula la peticion del cliente
     * @param response El objeto que encapsula la respuesta del servidor a la peticion en cuestion
     * @throws ServletException Si ocurre un error especifico de servlet
     * @throws IOException Si ocurre un error de entrada/salida
     */
    @Override
    protected void doGet(HttpServletRequest peticion,HttpServletResponse respuesta)
    throws ServletException,IOException {
        procesarPeticion(peticion,respuesta);
    }

    /**
     * Procesamiento de peticiones cliente POST
     * @param peticion El objeto que encapsula la peticion del cliente
     * @param response El objeto que encapsula la respuesta del servidor a la peticion en cuestion
     * @throws ServletException Si ocurre un error especifico de servlet
     * @throws IOException Si ocurre un error de entrada/salida
     */
    @Override
    protected void doPost(HttpServletRequest peticion,HttpServletResponse respuesta)
    throws ServletException,IOException {
        
        procesarPeticion(peticion,respuesta);
    }

    /**
     * Devuelve una descripcion de la funcionalidad del servlet
     * @return un String con la descripcion del servlet
     */
    @Override
    public String getServletInfo() {
        return "Servlet destinado al procesamiento de acciones relacionadas con los medicamentos dentro de la aplicacion movil";
    }

}

